//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖保佑             永无BUG 
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  
//                  不见满街漂亮妹，哪个归得程序员？  


/* ****************************************************************************
 * Author: 671643387
 * Date: 2015/4/10
 * ***************************************************************************/

var async = require('async');
var mysql   = require('mysql');
var config  = require('./config.js');

var hosts = config.server.host;
var mysqlCfg = config.mysql;


function each(arr, fn){
    for (var key in arr) {
        if (arr.hasOwnProperty(key)) {
            fn(arr[key], key);
        }
    }
}

var data = [];
var now_data = {};

each(hosts, function(host, wId){
    if (host.hasOwnProperty('game')) {
        each(host['game'], function(sidArr){
            var minId = +(sidArr[0]);
            var maxId = +(sidArr[1]);
            for (var sid=minId; sid <= maxId; ++sid) {
                var ip = host['ip'];
                var gatewayPort = config.game.gateway_port(sid);
                var payPort = config.game.pay_port(sid);
                data.push([sid, wId, ip, gatewayPort, payPort]);
            }
        });
    }
});

var total_count = data.length;
var cur_comp = 0;
var last_per = 0;

function showPercent() {
    var cur_per = Math.floor((cur_comp / total_count) * 100);
    if (cur_per > last_per && cur_per > 0) {
        console.log("完成 " + cur_per + "%");
        last_per = cur_per;
    }
}


var dbConn = mysql.createConnection({
    host: mysqlCfg.ip,
    port: mysqlCfg.port,
    user: mysqlCfg.user,
    password: mysqlCfg.password,
    database: "login",
    charset: mysqlCfg.charset,
    insecureAuth: true
});

dbConn.connect(function(err){
    if (!err) {
        _getAll(function(sus){
            if (!sus) {
                console.log('发生错误，退出');
            } else {
                async.eachSeries(data, function(sd, callback){
                    var INS = true;
                    var SQL = mysql.format(
                        "INSERT INTO server_d VALUES (?,?,?,?,?)", sd);
                    if (now_data.hasOwnProperty(sd[0])) {
                        SQL = mysql.format(
                            "UPDATE server_d SET host_id=?, host_ip=?, gateway_port=?, pay_port=? where id=?;", [
                                sd[1], sd[2], sd[3], sd[4], sd[0]
                            ]);
                        INS = false;
                    }
                    dbConn.query(
                        SQL,
                        function(err, res){
                            cur_comp = cur_comp + 1;
                            if (err) {
                                if (INS) {
                                    console.log("INSERT FAILED: " + JSON.stringify(sd));
                                } else {
                                    console.log("UPDATE FAILED: " + JSON.stringify(sd));
                                }
                            } else {
                                showPercent();
                            }
                            callback();
                        }
                    );
                }, function(err){
                    dbConn.end();
                    console.log('执行完毕。');
                });
            }
        });
    }
});

function _getAll(callback) {
    dbConn.query(
        "SELECT * FROM server_d;",
        function(err, rows){
            if (err) {
                console.log("SELECT FROM server_d FAILED: " + err);
                callback(false);
            } else {
                if (rows && rows.length > 0) {
                    each(rows, function(row){
                        now_data[row['id']] = row;
                    });
                }
                callback(true);
            }
        }
    );
}